#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PLC数据处理脚本 - CSV转换版本
功能：通过CSV转换方式读取Excel文件，避开格式兼容性问题
"""

import pandas as pd
import numpy as np
import os
import sys
import subprocess
from pathlib import Path

def translate_to_english_name(device_name, param_name):
    """
    将设备名称和参数名称翻译为英文组合名称
    """
    # 设备名称翻译映射
    device_mapping = {
        'MILD炉': 'MILD_FURNACE',
        '工艺曲线设定参数': 'PROCESS_CURVE_PARAMS',
        '1段时间': 'STAGE1_TIME',
        '2段时间': 'STAGE2_TIME', 
        '3段时间': 'STAGE3_TIME',
        '4段时间': 'STAGE4_TIME',
        '5段时间': 'STAGE5_TIME',
        '6段时间': 'STAGE6_TIME',
        '7段时间': 'STAGE7_TIME',
        '8段时间': 'STAGE8_TIME',
        '9段时间': 'STAGE9_TIME',
        '10段时间': 'STAGE10_TIME',
        '11段时间': 'STAGE11_TIME',
        '12段时间': 'STAGE12_TIME',
        '13段时间': 'STAGE13_TIME',
        '1段升始温度': 'STAGE1_START_TEMP',
        '2段升始温度': 'STAGE2_START_TEMP',
        '3段升始温度': 'STAGE3_START_TEMP',
        '4段升始温度': 'STAGE4_START_TEMP',
        '5段升始温度': 'STAGE5_START_TEMP',
        '6段升始温度': 'STAGE6_START_TEMP',
        '7段升始温度': 'STAGE7_START_TEMP',
        '8段升始温度': 'STAGE8_START_TEMP',
        '9段升始温度': 'STAGE9_START_TEMP',
        '10段升始温度': 'STAGE10_START_TEMP',
        '11段升始温度': 'STAGE11_START_TEMP',
        '12段升始温度': 'STAGE12_START_TEMP',
        '13段升始温度': 'STAGE13_START_TEMP'
    }
    
    # 参数名称翻译映射
    param_mapping = {
        '空气换热前实际温度': 'AIR_PREHEAT_ACTUAL_TEMP',
        '空气换热后实际温度': 'AIR_POSTHEAT_ACTUAL_TEMP', 
        '排烟换热前实际温度': 'EXHAUST_PREHEAT_ACTUAL_TEMP',
        '排烟换热后实际温度': 'EXHAUST_POSTHEAT_ACTUAL_TEMP',
        '温度探头1实际温度': 'TEMP_PROBE1_ACTUAL',
        '温度探头2实际温度': 'TEMP_PROBE2_ACTUAL',
        '温度探头3实际温度': 'TEMP_PROBE3_ACTUAL',
        '温度探头4实际温度': 'TEMP_PROBE4_ACTUAL',
        '空气实际压力': 'AIR_ACTUAL_PRESSURE',
        '空气总管实际压力': 'AIR_MAIN_ACTUAL_PRESSURE',
        '空气实际流量': 'AIR_ACTUAL_FLOW',
        '空气总管实际流量': 'AIR_MAIN_ACTUAL_FLOW',
        '烟气回流实际流量': 'FLUE_GAS_RECIRCULATION_ACTUAL_FLOW',
        '燃气实际压力': 'GAS_ACTUAL_PRESSURE',
        '燃气总管实际压力': 'GAS_MAIN_ACTUAL_PRESSURE',
        '燃气实际流量': 'GAS_ACTUAL_FLOW'
    }
    
    # 处理设备名称
    device_en = device_mapping.get(device_name, device_name)
    if device_en == device_name and device_name:
        # 如果没有映射，进行简单处理
        device_en = device_name.replace('段', 'STAGE').replace('时间', 'TIME').replace('升始温度', 'START_TEMP')
    
    # 处理参数名称  
    param_en = param_mapping.get(param_name, param_name)
    if param_en == param_name and param_name:
        # 如果没有映射，进行简单处理
        param_en = param_name.replace(' ', '_').upper()
    
    # 组合英文名称
    if device_en and param_en:
        return f"{device_en}_{param_en}".replace(' ', '_').upper()
    elif param_en:
        return param_en
    else:
        return ""

def read_excel_via_csv(file_path):
    """
    通过CSV转换的方式读取Excel文件
    """
    print("尝试方法：通过CSV转换读取Excel文件...")
    
    # 生成临时CSV文件路径
    temp_csv = str(file_path).replace('.xlsx', '_temp.csv').replace('.xls', '_temp.csv')
    
    try:
        print("步骤1：手动指导用户转换文件...")
        print("="*50)
        print("⚠️ 由于Excel文件格式兼容性问题，需要手动转换：")
        print("1. 打开Excel文件：加热炉实验室plc数据信息.xlsx")
        print("2. 点击 文件 -> 另存为")
        print("3. 选择格式：CSV (逗号分隔)(*.csv)")
        print(f"4. 保存为：{temp_csv}")
        print("5. 保存完成后，按任意键继续...")
        print("="*50)
        
        input("请按回车键继续（确保已保存CSV文件）...")
        
        # 检查CSV文件是否存在
        if not os.path.exists(temp_csv):
            print(f"错误：找不到CSV文件 {temp_csv}")
            print("请确保已经正确保存了CSV文件")
            return None
            
        # 读取CSV文件
        print("步骤2：读取CSV文件...")
        df = pd.read_csv(temp_csv, encoding='utf-8')
        print(f"成功读取CSV文件，共 {len(df)} 行")
        
        return df
        
    except UnicodeDecodeError:
        try:
            print("UTF-8编码失败，尝试GBK编码...")
            df = pd.read_csv(temp_csv, encoding='gbk')
            print(f"成功读取CSV文件（GBK编码），共 {len(df)} 行")
            return df
        except Exception as e:
            print(f"GBK编码也失败: {e}")
            return None
    except Exception as e:
        print(f"读取CSV文件失败: {e}")
        return None

def manual_merge_fill(df):
    """
    手动处理合并单元格 - 向下填充策略
    """
    print("正在处理可能的合并单元格...")
    
    # 对于所有列，向下填充空值
    for col_idx, col_name in enumerate(df.columns):
        print(f"处理第{col_idx+1}列: {col_name}")
        
        # 先尝试向下填充
        df[col_name] = df[col_name].fillna(method='ffill')
        
        # 手动填充剩余的空值
        for i in range(len(df)):
            if pd.isna(df.iloc[i, col_idx]) or str(df.iloc[i, col_idx]).strip() == '':
                # 向上查找最近的非空值
                for j in range(i-1, -1, -1):
                    if pd.notna(df.iloc[j, col_idx]) and str(df.iloc[j, col_idx]).strip():
                        df.iloc[i, col_idx] = df.iloc[j, col_idx]
                        break
    
    print("合并单元格处理完成")
    return df

def process_plc_data_csv(input_file, output_file):
    """
    使用CSV转换方式处理PLC数据
    """
    try:
        print(f"正在处理文件: {input_file}")
        
        # 检查输入文件是否存在
        if not Path(input_file).exists():
            print(f"错误：输入文件 {input_file} 不存在！")
            return False
            
        # 通过CSV转换读取
        df = read_excel_via_csv(input_file)
        if df is None:
            return False
            
        print(f"列名: {list(df.columns)}")
        
        # 处理可能的合并单元格
        df = manual_merge_fill(df)
        
        # 创建新的数据框，复制所有原始数据
        new_df = df.copy()
        
        # 添加英文参数名称列
        english_names = []
        
        print("开始生成英文参数名称...")
        
        for index, row in df.iterrows():
            # 获取设备名称和参数名称
            device_name = ""
            param_name = ""
            address = ""
            
            # 尝试从不同列获取设备名称（通常是第2列）
            if len(df.columns) > 1:
                device_name = str(row.iloc[1]) if pd.notna(row.iloc[1]) else ""
            
            # 尝试从不同列获取参数名称（通常是第3列）
            if len(df.columns) > 2:
                param_name = str(row.iloc[2]) if pd.notna(row.iloc[2]) else ""
            
            # 检查是否有地址列（通常是第5列）
            has_address = False
            if len(df.columns) > 4:
                address = str(row.iloc[4]) if pd.notna(row.iloc[4]) else ""
                has_address = bool(address.strip()) and address.strip().lower() not in ['nan', 'none', '']
            
            # 只有在有地址的情况下才生成英文名称
            if has_address and (device_name.strip() or param_name.strip()):
                english_name = translate_to_english_name(device_name.strip(), param_name.strip())
                if index < 5:  # 显示前5个示例
                    print(f"  行{index+1}: {device_name} + {param_name} -> {english_name}")
            else:
                english_name = ""
            
            english_names.append(english_name)
        
        # 在数据框的最后添加英文参数名称列
        new_df['参数英文名称'] = english_names
        
        # 保存到新文件
        new_df.to_excel(output_file, index=False, engine='openpyxl')
        print(f"成功生成新文件: {output_file}")
        print(f"新文件包含 {len(new_df)} 行数据，{len(new_df.columns)} 列")
        
        # 显示生成的英文名称统计
        non_empty_names = [name for name in english_names if name.strip()]
        print(f"\n✅ 生成了 {len(non_empty_names)} 个英文参数名称")
        
        if non_empty_names:
            print("英文名称示例:")
            for i, name in enumerate(non_empty_names[:10]):  # 显示前10个
                print(f"  {i+1}. {name}")
        
        # 清理临时文件
        temp_csv = str(input_file).replace('.xlsx', '_temp.csv').replace('.xls', '_temp.csv')
        if os.path.exists(temp_csv):
            try:
                os.remove(temp_csv)
                print(f"已清理临时文件: {temp_csv}")
            except:
                print(f"临时文件清理失败，请手动删除: {temp_csv}")
        
        return True
        
    except Exception as e:
        print(f"处理文件时发生错误: {e}")
        import traceback
        traceback.print_exc()
        return False

def main():
    """主函数"""
    # 设置文件路径
    script_dir = Path(__file__).parent
    input_file = script_dir / "加热炉实验室plc数据信息.xlsx"
    output_file = script_dir / "加热炉实验室plc数据信息_处理后.xlsx"
    
    print("=== PLC数据处理脚本 (CSV转换版本) ===")
    print(f"脚本目录: {script_dir}")
    print(f"输入文件: {input_file}")
    print(f"输出文件: {output_file}")
    print()
    print("⚠️ 此版本通过CSV转换解决Excel格式兼容性问题")
    print("   需要手动转换Excel文件为CSV格式")
    print()
    
    # 处理数据
    success = process_plc_data_csv(str(input_file), str(output_file))
    
    if success:
        print("\n🎉 数据处理完成！")
        print("✅ 新文件已生成，包含英文参数名称列")
    else:
        print("\n❌ 数据处理失败！")
        print("💡 建议检查：")
        print("   1. Excel文件是否正确保存为CSV格式")
        print("   2. CSV文件路径是否正确")
        print("   3. 文件是否被其他程序占用")
        sys.exit(1)

if __name__ == "__main__":
    main()
